package com.tensai.study.java.newconcept.typereactiveprogram.reactor.mono;

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import reactor.core.publisher.Mono;

import java.util.ArrayList;
import java.util.List;

/**
 * switchIfEmpty 仅仅只对当前的层次调用有效果
 * 内层检测内层链路上的null
 * 外层检测外层链路上的null
 *
 * @author Tensai
 */
@Slf4j
public class SwitchIfEmptyTest {

	/**
	 * 此方法用来检测双层嵌套的SwitchIfEmpty是否有效
	 */
	@Test
	public void test1() {
		Mono.just(2);
		List<String> list = new ArrayList<String>() {{
			add("a");
			add("q");
			add("e");
			add("s");
			add(null);
		}};

		Mono<Integer> mono = Mono.empty();
		mono.map(i -> Mono.justOrEmpty(get(i))
						.switchIfEmpty(Mono.error(() -> new Exception("NPE")))
				)
				.switchIfEmpty(Mono.just(Mono.just("NPE2")))
				.flatMap(it -> it.doOnNext(log::info)).subscribe();
	}

	@Test
	public void testSwitch() {
		Mono.empty()
				.switchIfEmpty(Mono.just(2))
				.flatMap(it -> Mono.just(1))
				.subscribe(System.out::println);
	}

	private String get(int i) {
		if (i == 1) {
			return null;
		} else if (i == 2) {
			return "hello";
		} else {
			return "ok";
		}
	}
}
